import axios from "axios";
import { getStore, setStore } from "@/utils/store";
import { baseURL } from '@/config';
import { Message ,Loading} from 'element-ui';
const headers = {
    "Content-Type": "application/x-www-form-urlencoded"
};
let loadingInstace = null;
let loadingCount = 0;
const instance = axios.create({
    baseURL: !process.env.NODE_ENV == 'development' ? '/' : "",
    timeout: 20000
});
const startLoading = () => {
    loadingInstace = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
    });
};
const endLoading = () => {
    loadingInstace.close();
};
const showLoading = () => {
    if (loadingCount === 0) {
        startLoading();
    }
    loadingCount += 1;
};
const hideLoading = () => {
  if (loadingCount <= 0) {
    return;
  }
  loadingCount -= 1;
  if (loadingCount === 0) {
    endLoading();
  }
};
//请求拦截器，使用前可以执行的操作
instance.interceptors.request.use(
    config => {
        if (config.data && config.data.loading) {
            showLoading();
            config.params && delete config.params.loading;
            config.data && delete config.data.loading;
        }
        return config;
    },
    err => {
        hideLoading();
        return Promise.reject(err);
    }
);

//添加响应拦截器 对响应数据做处理
// 添加响应拦截器loadingFn
instance.interceptors.response.use((response) =>{
        hideLoading();
        return response;
    },(error)=> {
        hideLoading();
        return Promise.reject(error);
    }
);
/**
 *  加工请求参数，默认post
 *
 * @param {*} url 接口地址
 * @param {*} [param={}] 接口参数
 * @param {*} [opt={
 *  method : 'get' //以get方式请求，默认为post
 *  cache : '缓存名' //接口数据需要缓存时配置，默认不缓存
 *  token : 是否传入token，默认取本地存储
 * }]
 * @returns axios params
 */
const setParams = (url, param = {}, opt = {}) => {
    let userInfo =  getStore('userInfo');
    let token = userInfo ? userInfo.token:null
    //接口统一传销售人id 和shopCode  //用来做测试用
    // if (opt.method !== "get" && opt.haveUserData){
    //     if(userInfo){
    //         if(userInfo.adminType==2){ //总部角色
    //             param.type=2;
    //         }else{
    //             param.type= param.type || userInfo.roleType;
    //             if(param.type==2){  //店长
    //                 if(!param.shopCodes){
    //                     // param.shopCodes = userInfo.authShopNos;
    //                     param.shopCodes = userInfo.authShopNos && userInfo.authShopNos.length ? userInfo.authShopNos : userInfo.shopCode ? [userInfo.shopCode] : null;
    //                 }
    //             }else{
    //                 if(userInfo &&!param.guideId){
    //                     // param.guideId = '7306'
    //                     param.guideId =  userInfo.sapUserId
    //                 }
    //             }
    //         }
    //     }
    // }
    let curParams = {
      headers: {
        "Content-Type": "application/json",
        token:token
      }
    };
    curParams.headers = {
      ...headers,
      ...curParams.headers,
      ...opt.headers
    };
    // get请求和post请求数据区分
    if (opt.method === "get") {
      curParams = {
        ...curParams,
        params: param,
        method: opt.method
      };
    } else {
        // if(opt.pageSize || opt.pageIndex){
        //     curParams.data = {
        //         'condition':param,
        //         pageIndex:opt.pageIndex,
        //         pageSize:opt.pageSize,
        //         loading:opt.loading
        //     }
        // }else{
            curParams.method = opt.method || 'post'
            curParams.data ={
                ...param,
                loading:opt.loading
            };
        // }
    }
    // let resultUrl = opt.noUrl ? url : baseURL+url
    let resultUrl = url;
    // 请求参数
    return {
      method: "post",
      url:resultUrl,
      ...curParams
    };
  };
export default {
    /**
     * 同时支持get和post请求
     *
     * @param {*} url 接口地址
     * @param {*} [param={}] 接口参数
     * @param {*} [opt={
     *  type : true, //将params参数以key/value形式拼接,method为get时生效
     *  method : 'get' //以get方式请求，默认为post
     *  cache : '缓存名' //接口数据需要缓存时配置，默认不缓存
     * }]
     * @returns prmoise对象
     */
    fetch(url, param = {}, opt = {}) {
        const opts = setParams(url, param, opt);
        return new Promise((resolve, reject) => {
            // 判断是否需要缓存
            if (opt.cache && getStore(opt.cache)) {
                resolve(getStore(opt.cache));
            } else {
                instance(opts)
                    .then(res => {
                       if(res.data.code==="1000006"){ //登录过期
                            window.location.href = '#/login';
                       }
                        res.data.status = res.data.status == 0 ? 200 : res.data.status;
                        if (res.status != '200' || res.data.status != "200"|| res.data.code=='60011') {
                            if (opt.hasErrMsg) {
                                resolve(res);
                            } else {
                                if(!opt.notTip){
                                    let msg = res.data.msg || '网络异常'
                                    // window.globalVue.$toast.fail(msg)
                                    Message({
                                        type: 'error',
                                        message: msg
                                    });
                                }
                                reject(res.data)
                            }
                        } else {
                            if( res.data.result || res.data ){
                                opt.cache && setStore(opt.cache, res.data.result || res.data);
                                resolve(res.data.result || res.data);
                            }
                            else{
                                // let msg = res.data.msg || '网络异常'
                                //     window.globalVue.$toast.fail(msg)
                                Message({
                                    type: 'error',
                                    message: '网络异常'
                                });
                                reject(res);
                            }
                            // else{
                            //     let msg = res.data.msg || '网络异常'
                            //     window.globalVue.$toast.fail(msg)
                            // }
                            // if (res.page) {
                            //     res.data = {
                            //         data: res.data,
                            //         page: res.page
                            //     };
                            // }
                            // opt.cache && setStore(opt.cache, res.data.result || res.data);
                            // resolve(opt.hasErrMsg ? res : res.data.result);
                        }
                    })
                    .catch(error => {
                      
                        // if (loadingInstace) {
                        //   window.globalVue.$toast.clear();
                        //   errFun(error);
                        // }
                        if(opt.notTip){
                            return  reject(error); 
                        }
                        let msg = error.message || '网络异常'
                        // window.globalVue.$toast.fail(msg)
                        Message({
                            type: 'error',
                            message: '网络异常'
                        });
                        reject(error);
                    });
            }
        });
    },
    // 上传文件
    uploadFile(url,param){
        showLoading();
        return new Promise((resolve, reject) => {
            instance.post(url,param).then(res=>{
                hideLoading();
                if (res.status!='200' || res.data.status != "200") {
                        let msg = res.data.msg || '网络异常'
                        Message({
                            type: 'msg',
                            message: '文件过大'
                        });
                        // window.globalVue.$toast.fail(msg)
                        reject(res.data)
                } else {
                    if( res.data.result || res.data ){
                        resolve(res.data.result || res.data);
                    }
                    else{
                        reject(res);
                        Message({
                            type: 'msg',
                            message: '文件过大'
                        });
                    }
                }
            }).catch(error => {
                Message({
                    type: 'error',
                    message: '文件过大'
                });
                reject(error);
            })
        })
    }
}

// .catch(error => {
          
//     // if (loadingInstace) {
//     //   window.globalVue.$toast.clear();
//     //   errFun(error);
//     // }
//     let msg = error.message || '网络异常'
//     window.globalVue.$toast.fail(msg)
//     reject(error);
// });